package com.kaifamiao.jdbc;

import java.sql.*;

/**
 * 结果集元数据
 */
public class JdbcTest05 {

    public static void main(String[] args) throws SQLException {

        DbHelper dh = new DbHelper();
        dh.load();
        Connection c = dh.connect();
        Statement st = c.createStatement();

        // 查询语句中可以使用 列的别名 和 表的别名
        String sql = "SELECT e.empno AS id , e.ename name , e.job , e.sal salary " +
                     "FROM emp e WHERE e.deptno = 20" ;
        ResultSet rs = st.executeQuery( sql );

        // 使用结果集对象获得结果集元数据
        ResultSetMetaData rsMetaData =  rs.getMetaData();

        // 获取结果集中每行数据所包含的列数
        int count = rsMetaData.getColumnCount();
        System.out.println( count );

        // 整个Java中为数不多的几个从 1 开始计数的场景: 列数从 1 开始计数
        for( int i = 1 ; i <= count ; i++ ){
            // 获取指定列的名称 ( 当为列指定别名时 MySQL 和 Oracle 表现是不一样的 )
            String columnName = rsMetaData.getColumnName( i );
            System.out.print( columnName + " , " );
            // 获取用于打印输出和显示的指定列的建议标题(如果指定了别名则返回别名，否则就是列名)
            String label = rsMetaData.getColumnLabel( i );
            System.out.print( label + " , " );
            // 获取指定列的SQL类型( 用 java.sql.Types 中定义的常量来表示 SQL类型 )
            int columnType = rsMetaData.getColumnType( i );
            System.out.print( columnType + " , " );
            // 获取指定列的数据库特定的类型名称(即该列对应的数据库类型)
            String columnTypeName = rsMetaData.getColumnTypeName( i );
            System.out.print( columnTypeName + " , " );
            // 如果调用方法 ResultSet.getObject从列中获取值，则返回构造其实例的 Java 类的完全限定名称
            String columnClassName = rsMetaData.getColumnClassName( i );
            System.out.print( columnClassName + " , " );
            // 获取指定列的指定列宽
            int precision = rsMetaData.getPrecision( i );
            System.out.print( precision + " , " );
            // 获取指定列的小数点右边的位数
            int scale = rsMetaData.getScale( i );
            System.out.println( scale );
        }

        if( rs.next() ) { // 调用一次next方法将"指针"定位到第一行 (不考虑处理第一行之后的内容)
            Object x = rs.getObject( "id" );
            System.out.println( x );
            System.out.println( x.getClass() );
        }

        dh.release( rs );
        dh.release( st );
        dh.release( c );

    }

}
